// function a(){
//   let b = 11
//   console.log(this.b);
// }
// a() // this 指向window   undefined

// let name = 'window'
// let a = {
//   //  name : 'nname',
//    fn: function(){
//      console.log(this.name)
//    }
// }
// window.a.fn() // undefined    this指向a  不管前面多少个对象   

// let name = 'window'
// let a = {
//    name : 'nname',
//    fn: function(){
//      console.log(this.name)
//    }
// }
// let b = a.fn
// b()   // nname   把函数方法给b  b调用  this指向window


let a = {
  name : '11',
  func1: function(){
    console.log(this.name)
  },
  func2: function(){
    let _this = this;
    setTimeout(function(){  //或者用箭头函数  this就指向a对象
      console.log(_this.name);
    },1000)
  }
}
a.func1(); // 重点
a.func2()
// setTimeout(function(){
//   console.log(this.name);
// },1000)        若这样写this指向window还可以通过 call和apply 改变this指向
//call 和apply 前面得是个函数    this 指向是个作用域对象

/* 重写call方法 */
Function.prototype.mycall = function(ctx) {
  ctx = ctx || window
  ctx.yy = this  //yy只是设置个属性， this是b函数  把函数给ctx对象 跟上述注释重点一个意思
  console.log(arguments) // 这里的argment 是传过来的所有 ，包括a对象，若b.mycall(a,1,2) argment为[a,1,2]
  let newArgs =[...arguments].slice(1)
  let res = ctx.yy(...newArgs)
  return res
}

let b = a.func1
b.mycall(a)